#ifndef LOGGER_H_
#define LOGGER_H_

/**********************************************************************
 *	logger.h
 * 
 *  Descripcion: Clase sigleton encargada de guardar la salida de las 
 * 			     operaciones realizadas en los archivos out. 
 *  
 *
 *********************************************************************/

#include <fstream>
#include <iostream>
#include <string>
#include <stdexcept>
#include <ctime>
#include "excep_logger_cerrado.h"

class Logger{
	
	private:
		static Logger* instance; //Instancia del singleton
		std::ofstream archivo_out; //stream para manejar el archivo OUT
		
		
		/*
		 * Constructor de copia
		 */
		Logger(Logger &l){}
		
		/*
		 * Operador = para prohibir la copia
		 */ 
		Logger& operator=(Logger &l){return l;} 
		
		/*
		 * Constructor de la clase. Por defecto NO muestra por pantalla
		 */ 
		Logger(){}
		
		/*
		 * Genera un string con el formato aaaaddmm_HHMMSS
		 */
		 std::string time_stamp(); 
		
	public:
		/*
		 * Devuelve la unica instancia del Logger
		 */ 
		static Logger* get_instance();
			
		/*
		 * Destructor
		 */
		~Logger(){}
		
		/*
		 * Crea el archivo de log con el nombre 
		 * 		Resultados-fechahora.7506
		 * Si estaba abierto un log, lo cierra
		 */ 
		 
		void comenzar_log();
		
		/*
		 * Cierra el archivo de log abierto. Si no habia ninguno,
		 * no hace nada.
		 */
		void terminar_log();
		
		/*
		 * Si el logger esta abierto, salte una linea en el archivo.
		 * Si esta cerrado, lanza una excepcion.
		 */ 
		void saltar_linea() throw (ExcepLoggerCerrado);
		/*
		 * Pasa la cadena al archivo de log abierto.
		 * Si esta habilitada la opcion de mostrar por pantalla lo 
		 * hace.
		 * 
		 * Si el archivo de log esta cerrado, tira excepcion
		 */
		 //TODO: Revisar lo de las excepciones
		friend void operator<<(Logger &l, std::string log ) throw (ExcepLoggerCerrado);
	
		/*
		 * Copia el contenido del archivo al del log
		 * 
		 * Si el archivo de log esta cerrado tira una excepcion, asi
		 * como tambien si el de entrada esta cerrado
		 */
		//TODO: Revisar lo de las excepciones
		friend void operator<<(Logger &l , std::ifstream &archivo) throw (ExcepLoggerCerrado);
		
		/*
		 * Elimina la instancia creada por el singleton.
		 * DEBE ser llamado cuando NO se utiliza mas.
		 */ 
		 static void destroy();
		 
		 /*
		  * Devuelve true si hay un archivo de log abierto
		  */
		  bool hay_log_abierto(); 
};
#endif /*LOGGER_H_*/
